package com.nosnow.handler;

import com.nosnow.common.utils.ExceptionUtils;
import com.nosnow.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author by bingHeng
 * @version 1.0
 * @Create 2020/3/30 0:11
 *
 * 统一异常处理类
 */
@ControllerAdvice
@Slf4j // 添加此注解后，可以将自定义异常的错误信息写入到异常日志中去
public class GlobalExceptionHandler {

    /**
     * 统一异常处理：
     * 我们想让异常结果也显示为统一的返回结果对象，并且统一处理系统异常信息，那么需要统一异常处理
     *
     * 特定异常和全局异常处理机制：出现异常时先查找是否有指定的异常，如果有则抛出指定的异常，没有则抛出全局异常
     */

    /**
      * @Description: 全局统一异常处理
      * @Param e
      * @return com.nosnow.common.utils.R
      * @author bingHeng
      * @Date 2020/6/8 18:48
     */
    @ExceptionHandler(Exception.class) // 指定出现哪种异常执行这个方法
    @ResponseBody // 为了能够返回数据
    public R error(Exception e) {
        log.error(ExceptionUtils.getMessage(e));
        e.printStackTrace();
        return R.error().message("椋鸟飞走了,建议您联系椋鸟的主人哦");
    }

    /**
      * @Description: 特定异常处理-0不能为除数
      * @Param e
      * @return com.nosnow.common.utils.R
      * @author zhaokeyao
      * @Date 2020/6/8 18:49
     */
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public R error(ArithmeticException e) {
        log.error(ExceptionUtils.getMessage(e));
        e.printStackTrace();
        return R.error().message("执行了除数为0的异常...");
    }


    /**
      * @Description: 自定义异常处理
      * @Param e
      * @return com.nosnow.common.utils.R
      * @author bingHeng
      * @Date 2020/6/8 18:49
     */
    @ExceptionHandler(SnowflakeException.class)
    @ResponseBody
    public R error(SnowflakeException e) {
        log.error(ExceptionUtils.getMessage(e));
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}
